package com.guang.lock;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @author lg
 * @Description  lock锁搭配着线程检测中断机制而来进行操作，无法满足条件的时候而中断
 * @date 2022/10/17 10:54
 */
public class ReentrantLockDemo4 {
    private static Logger logger = LoggerFactory.getLogger(ReentrantLockDemo4.class);
    static ReentrantLock lock = new ReentrantLock();

    public static void main(String[] args) throws InterruptedException {

        Thread t1 = new Thread(() -> {
            lock.lock();
            try {
                logger.info("线程1获取得到锁，开始来进行执行代码");
                try {
                    TimeUnit.SECONDS.sleep(5);
                } catch (InterruptedException e) {
                    logger.error("当前线程不需要再次执行任务来进行代码执行了");
                }
            }finally {
                lock.unlock();
                logger.info("当前线程的标记状态为：{}",Thread.currentThread().isInterrupted());
                // 擦除掉当前线程的标记状态，因为如果需要使用到线程池的时候，如果标记状态没有擦除的话，会对下一个线程造成影响
                Thread.interrupted();
            }
        }, "t1");

        Thread t2 = new Thread(() -> {
            lock.lock();
            try {
                if (Thread.currentThread().isInterrupted()){
                    // 当前线程已经设置为终止状态，不应该来执行代码
                    logger.info("当前线程已经被终止了，不应该再来执行逻辑代码");
                }
            } finally {
                logger.info("当前线程的标记状态为：{}",Thread.currentThread().isInterrupted());
                lock.unlock();
                // 擦除掉当前线程的标记状态，因为如果需要使用到线程池的时候，如果标记状态没有擦除的话，会对下一个线程造成影响
                Thread.interrupted();
                logger.info("重新标记当前线程：{}",Thread.currentThread().isInterrupted());
            }
        }, "t2");
        t1.start();
        TimeUnit.SECONDS.sleep(1);
        t2.start();
        TimeUnit.SECONDS.sleep(1);
        // 发送中断信号
        t2.interrupt();

    }
}
